import { useRouter } from "next/router"; import AppBar from "../../../../components/AppBar"; import Layout from "../../../../components/Layout"; import WithAuth from "../../../../components/WithAuth"; import { useAuth } from "../../../../helpers/auth"; import useFormValidation from "../../../../helpers/formValidation"; import { useEffect, useState } from "react"; import apiOdoo from "../../../../helpers/apiOdoo"; import ReactSelect from "react-select"; import convertToOption from "../../../../helpers/convertToOption"; import { toast } from "react-hot-toast"; import _ from "lodash"; const validationScheme = { type: ['label:Label Alamat', 'required'], name: ['label:Nama', 'required'], email: ['label:Email', 'required', 'email'], mobile: ['label:No. Handphone', 'required', 'maxLength:16'], street: ['label:Alamat', 'required'], city: ['label:Kota', 'required'], zip: ['label:Kode Pos', 'required'] }; const typesSelection = [ { value: 'contact', label: 'Contact Address' }, { value: 'invoice', label: 'Invoice Address' }, { value: 'delivery', label: 'Delivery Address' }, { value: 'other', label: 'Other Address' }, ]; export async function getServerSideProps( context ) { const { id } = context.query; const address = await apiOdoo('GET', `/api/v1/partner/${id}/address`); let initialFormValue = { type: typesSelection.find((x) => x.value == address.type), name: address.name, email: address.email, mobile: address.mobile, street: address.street, zip: address.zip, city: convertToOption(address.city), district: convertToOption(address.district), subDistrict: convertToOption(address.sub_district) }; return { props: { id, initialFormValue } }; } export default function EditAddress({ id, initialFormValue }) { const [auth] = useAuth(); const router = useRouter(); // Master Data const [cities, setCities] = useState([]); const [districts, setDistricts] = useState([]); const [subDistricts, setSubDistricts] = useState([]); const { formInputs, formErrors, handleInputChange, handleSelectChange, handleFormSubmit, hasChangedInputs } = useFormValidation({ validationScheme, initialFormValue }); useEffect(() => { if (cities.length == 0) { const loadCities = async () => { let dataCities = await apiOdoo('GET', '/api/v1/city'); dataCities = dataCities.map((city) => ({ value: city.id, label: city.name })); setCities(dataCities); }; loadCities(); } }, [cities]); useEffect(() => { if (hasChangedInputs?.city) handleSelectChange('district', null); if (formInputs.city) { const loadDistricts = async () => { let dataDistricts = await apiOdoo('GET', `/api/v1/district?city_id=${formInputs.city.value}`); dataDistricts = dataDistricts.map((district) => ({ value: district.id, label: district.name })); setDistricts(dataDistricts); }; loadDistricts(); } }, [ formInputs.city, hasChangedInputs.city, handleSelectChange ]); useEffect(() => { if (hasChangedInputs?.district) handleSelectChange('subDistrict', null); if (formInputs.district) { const loadSubDistricts = async () => { let dataSubDistricts = await apiOdoo('GET', `/api/v1/sub_district?district_id=${formInputs.district.value}`); dataSubDistricts = dataSubDistricts.map((subDistrict) => ({ value: subDistrict.id, label: subDistrict.name })); setSubDistricts(dataSubDistricts); }; loadSubDistricts(); } }, [ formInputs.district, hasChangedInputs.district, handleSelectChange ]); const onSubmit = async () => { const parameters = { ...formInputs, city_id: formInputs.city?.value, district_id: formInputs.district?.value, sub_district_id: formInputs.subDistrict?.value, type: formInputs.type?.value }; const address = await apiOdoo('PUT', `/api/v1/partner/${id}/address`, parameters); if (address?.id) { toast.success('Berhasil mengubah alamat'); router.back(); } } return ( { !_.isEmpty(formInputs) && (
handleFormSubmit(e, onSubmit)}> handleSelectChange('type', value)} value={formInputs?.type} />
{formErrors?.type}
{formErrors?.name}
{formErrors?.email}
{formErrors?.mobile}
{formErrors?.street}
{formErrors?.zip}
state.menuIsOpen || state.isFocused ? '!border-yellow_r-9' : '' }} options={cities} value={formInputs.city} onChange={(value) => handleSelectChange('city', value)} />
{formErrors?.city}
state.menuIsOpen || state.isFocused ? '!border-yellow_r-9' : '' }} options={districts} value={formInputs.district} onChange={(value) => handleSelectChange('district', value)} isDisabled={!formInputs.city} /> state.menuIsOpen || state.isFocused ? '!border-yellow_r-9' : '' }} options={subDistricts} onChange={(value) => handleSelectChange('subDistrict', value)} value={formInputs.subDistrict} isDisabled={!formInputs.district} /> ) }
); }